//1、引入axios
import axios from "axios";
// 引入element消息弹窗
import {Message} from "element-ui";

import cookieUtils from '@/utils/CookieUtils'

//定义axios实例
let instance = axios.create({
    // baseURL: "http://localhost:8888/", //全局请求地址前缀
    baseURL: "/api", //全局请求地址前缀,配合vue.config.js中的proxys使用
    // timeout: 1000, //全局请求超时时间
    headers: {
        'Content-Type': 'application/json',
    }
})

//2、设置请求拦截器 这个拦截器在客户端请求到达服务端之前执行
// use方法：第一个参数：当请求成功通过拦截器时执行，常见用于修改请求配置（添加token,修改请求头）
//          第二个参数：当请求在拦截器阶段发生错误时执行，常用于处理请求错误，
instance.interceptors.request.use(function (config) {
    //此次可以在请求时添加一下逻辑或携带参数
    config.headers['token'] = cookieUtils.getCookie("token")
    return config;
}, function (err) {
    //当请求失败了，拒绝请求 报错信息，如果不返回调用者无法获取报错信息。
    return Promise.reject(err);
})

//3、设置响应拦截器 这个拦截器在服务器响应到达客户端之前执行
// use方法：第一个参数：当响应成功通过拦截器时执行，常见用于修改响应数据
//          第二个参数：当响应在拦截器阶段发生错误时执行，常用于处理响应错误
//在服务器响应到达客户端之前，响应拦截器会先对响应进行拦截和处理。如果响应拦截器对响应进行了修改，
// 那么修改后的响应数据会被传递给后续的getUserById的then方法
instance.interceptors.response.use(function (resp) {
    // console.log("响应拦截 resp=",resp);
    // console.log("响应拦截 resp.data=",resp.data);
    let code = resp.data.code;
    switch (code) {
        case 200:
            // Message.success(resp.data.message);
            return resp.data;
            break;
        case -1:
            Message.error(resp.data.message);
            return Promise.reject(resp.data.msg);
            break;
        case 401:
            Message.error("登录过期，请重新登录");
            return Promise.reject(resp.data.msg);
            break;
        case 403:
            Message.error("权限不足，请联系管理员");
            return Promise.reject(resp.data.msg);
            break;
    }
    return resp.data;
}, function (err) {
    console.log("响应拦截 err=", err);
    let code = err.code;
    switch (code) {
        case "ECONNABORTED":
            Message.error("请求超时");
            return Promise.reject(err);
            break;
        case "ERR_NETWORK":
            Message.error("请求失败，请联系管理员");
            return Promise.reject(err);
            break;
        case "ERR_BAD_RESPONSE":
            Message.error("服务器内部异常，请联系管理员");
            return Promise.reject(err);
            break;
    }

    return Promise.reject(err);
})

//导出一个公共的请求方法
export default function request(config) {
    return instance(config);
}